package com.agilya.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.agilya.dao.DAOQCM;
import com.agilya.dao.DAOQuestion;
import com.agilya.dao.daointerface.QCMDAO;
import com.agilya.dao.daointerface.QuestionDAO;
import com.agilya.dao.exception.DAOExceptions;
import com.agilya.modele.Proposition;
import com.agilya.modele.QCM;
import com.agilya.modele.Question;

/**
 * Servlet implementation class AfficherQuestion
 * 
 * Affiche toutes les questions d'un QCM une à une afin que l'utilisateur puisse y répondre
 * 
 */
@WebServlet("/AfficherQuestion")
public class AfficherQuestion extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Inject
	@DAOQuestion
	private QuestionDAO questiondao;
	@Inject
	@DAOQCM
	private QCMDAO qcmdao;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AfficherQuestion() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher rd = request.getRequestDispatcher("/page.jsp");
		try {
			// cas du retour arrière
			if (request.getParameter("action") != null && request.getParameter("action").equals("retour")) {
				int questionPrecedente = Integer.parseInt(request.getParameter("questionCourante")) - 1;
				request.setAttribute("questionCourante", questionPrecedente);
			} else {
				int idqcm = Integer.parseInt(request.getParameter("idqcm"));
				// cas initial lors du premier accès par l'url afficherquestion
				QCM qcm = qcmdao.getQCMbyId(idqcm);
				// récuperation des listes de questions et propositions
				qcm.setListeQuestions(questiondao.getAllQuestionsEtPropositionsByQCM(idqcm));
				session.setAttribute("qcm", qcm);
				request.setAttribute("questionCourante", 1);
			}
		} catch (DAOExceptions e) {
			request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");
			e.printStackTrace();
		} catch (NullPointerException | NumberFormatException e) {
			e.printStackTrace();
			// Impossible de trouver le qcm ou les questions
			// Nothing le message d'erreur sera afficher par la jsp
			rd = request.getRequestDispatcher("AfficherQCM");
		}

		request.setAttribute("page", "/afficherQuestion.jsp");

		rd.forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// passage à la question suivante
		HttpSession session = request.getSession();
		RequestDispatcher rd;

		try {
			// récupération du QCM en session
			QCM qcm = (QCM) session.getAttribute("qcm");

			// numéro de la question en cours
			int questionCourante = Integer.parseInt(request.getParameter("questionCourante"));

			// tableau de réponses par question
			String[] reponsesQuestionTemp = request.getParameterValues("proposition");

			HashMap<Question, List<Proposition>> reponsesQCM = new HashMap<>();

			// conversion du tableau de string en liste de proposition
			List<Proposition> listePropositionsRepondues = new ArrayList<>();

			// verification que la question a été répondue
			if (reponsesQuestionTemp != null) {
				for (String id : reponsesQuestionTemp) {
					// on récupere les propositions repondues par l'id qu'on a
					// converti en entier, et on ajoute ces propositions dans une liste
					listePropositionsRepondues.add(questiondao.getPropositionById(Integer.parseInt(id)));
				}

				// on fait correspondre les propositions répondues à chaque question dans une HashMap
				reponsesQCM = (HashMap<Question, List<Proposition>>) session.getAttribute("reponsesQCM");

				// vérification de la présence ou non de la hashMap reponsesQCM en session. Si elle n'est pas présente, on la crée
				if (reponsesQCM == null) {
					reponsesQCM = new HashMap<>();
					session.setAttribute("reponsesQCM", reponsesQCM);

				}
				// on ajoute les propositions répondues à une question dans la hashmap reponsesQCM
				reponsesQCM.put(qcm.getListeQuestions().get(questionCourante - 1), listePropositionsRepondues);
			}
			// on teste si on est dans la dernière question
			if (questionCourante < qcm.getListeQuestions().size()) {

				request.setAttribute("questionCourante", questionCourante + 1);

				request.setAttribute("page", "/afficherQuestion.jsp");
				rd = request.getRequestDispatcher("/page.jsp");
			} else {

				// test récupération des réponses
				for (Iterator<Question> ii = reponsesQCM.keySet().iterator(); ii.hasNext();) {
					Question key = (Question) ii.next();
					List<Proposition> listePropositionTest = reponsesQCM.get(key);
					System.out.println("Question " + key.getId() + " " + key.getLibelle() + " = ");

					for (int i = 0; i < listePropositionTest.size(); i++) {
						System.out.println(" cochees = " + listePropositionTest.get(i).getId());
					}
				}
				rd = request.getRequestDispatcher("/AfficherResultat");
			}
			rd.forward(request, response);

		} catch (DAOExceptions e) {
			request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");
			e.printStackTrace();
		} catch (NullPointerException e) {
			// La session à du ce terminer
			// Retour à la case départ
			doGet(request, response);
		}

	}

}
